#!/usr/bin/env python
# -*- coding: utf-8 -*-

import MySQLdb, logs, time

from subprocess import Popen, PIPE

from ..lib.plugin import MeliponiniPlugin
from ..lib.config import Config

config = Config()

def log(s):
    logs.log(s)


class plugin(MeliponiniPlugin):
    def constructor(self, method):
        self.dbuser = config.get('db.user')
        self.dbpass = config.get('db.pass')
        
        if method == 'get':
            self.addHTTPHandler('/db/list/', self.commandList)
            
        self.addTimer(60, self.timerCheckService)
        
        
    '''
    TIMER checkService
    Comprueba que el servicio de base de datos esté levantado
    '''
    def timerCheckService(self):
        return
        
        
    '''
    GET /db/list/
    '''
    def commandList(self):
        try:
            db = MySQLdb.connect(host='localhost', user=self.dbuser, passwd=self.dbpass)

            cursor = db.cursor()
            sql = 'SHOW DATABASES;'
            cursor.execute(sql)
            res = cursor.fetchall()
            data = []
            for reg in res:
                data.append(reg[0])
                
            # enviamos datos
            self.responseJSON(data)

        except MySQLdb.MySQLError:
            log( 'mysql error' )
            self.response500()

    '''
    GET /db/backup/{dbname}/
    Nos solicitan un backup de una base de datos
    '''
    def commandBackup(self):
        # path = /db/backup/dbname
        database = self.path.split('/')[3]
        # TODO: añadir timestamp
        target = database + '-' + time.strftime("%Y%m%d%H%M%S", time.localtime()) + '.sql.bz2'

        # ejecutamos mysqldump
        p1 = Popen([self.config.MYSQL_DUMP_BIN, '-u'+self.dbuser, '-p'+self.dbpass, '--add-drop-database', database], stdout=PIPE)
        # procesamos la salida de mysqldump con bzip2
        p2 = Popen([self.config.BZIP2_BIN, '-c'], stdin=p1.stdout, stdout=PIPE)
        
        # devolvemos el fichero comprimido
        self.responseFile(p2.communicate()[0], target, 'application/x-bzip2')
            

    '''
    GET /db/users/
    Nos solicitan información/listado de los usuarios de la base de datos
    '''
    def commandUsers(self):
        db = MySQLdb.connect(host='localhost', user=self.dbuser, passwd=self.dbpass, db='mysql')
        cursor = db.cursor()
        sql = 'SELECT host,user,password FROM user;'
        cursor.execute(sql)
        resultado = cursor.fetchall()
        for registro in resultado:
            print registro[0] , '|' , registro[1]
            
        # TODO ...
            
        return
        

    '''
    GET /db/import/{dbname}/{node}/
    
    Obtiene una copia de base de datos de otro nodo, y la importa en la base de
    datos local, eliminando las tablas del servidor local por las del servidor
    del nodo remoto.
    
    El nodo debe estar en la tabla de nodos local, y con permiso para /db/backup/
    
    Esto es útil para que el nodo de una máquina de desarrollo actualice su base
    de datos con la de producción.
    '''
    def commandImport(self):
        return
